
open Common

module type BASE =
sig
  type t
  val compare : t -> t -> int
  val default : t
  val to_string : t -> string
end

module type T =
sig
  include BASE
  val lt : t -> t -> bool
  val le : t -> t -> bool
  val gt : t -> t -> bool
  val ge : t -> t -> bool
  val eq : t -> t -> bool
  val neq : t -> t -> bool
  val max : t -> t -> t
  val maxl : t list -> t
  val min : t -> t -> t
  val minl : t list -> t

  module Ops : 
  sig
    val ( < ) : t -> t -> bool
    val ( <= ) : t -> t -> bool
    val ( > ) : t -> t -> bool
    val ( >= ) : t -> t -> bool
    val ( = ) : t -> t -> bool
    val ( <> ) : t -> t -> bool
  end
end

module S(B : BASE) : T with type t = B.t 

module Int : T with type t = int 
module String : T with type t = string 
module Float : T with type t = float 
